P3312 数表
题意
求出 \[ \sum_{i=1}^n\sum_{j=1}^m\sigma(\gcd(i,j))[\sigma(\gcd(i,j))\le a] \] 其中 \(\sigma\) 表示约数和。
思路/推导
考虑没有 \(a\) 的限制的情况。 \[ \begin{aligned} ans&=\sum_{d=1}^{\min(n,m)}\sigma(d)\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{m}{d}\right\rfloor}[\gcd(i,j)=1]\\ &=\sum_{d=1}^{\min(n,m)}\sigma(d)\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor}\sum_{j=1}^{\left\lfloor\frac{m}{d}\right\rfloor}\sum_{p\mid i\land p\mid j}\mu(p)\\ &=\sum_{d=1}^{\min(n,m)}\sigma(d)\sum_{p=1}^{\left\lfloor\frac{\min(n,m)}{d}\right\rfloor}\mu(p)\left\lfloor\frac{n}{dp}\right\rfloor\left\lfloor\frac{m}{dp}\right\rfloor\\ &=\sum_{T=1}^{\min(n,m)}\sum_{d=1}^T\sigma(d)\mu(\frac Td)\left\lfloor\frac{n}{T}\right\rfloor\left\lfloor\frac{m}{T}\right\rfloor \end{aligned} \]
考虑加入 \(a\) 的限制。将询问按照 \(a\) 大小离线,然后用一个树状数组维护 \(\sum_d\sigma(d)\mu(\frac Td)\) 的前缀和即可。
具体是将线性筛出的所有数的约数和从小到大进行排序,在从小到大查询的时候进行更新。
不会筛 \(\sigma\) 的可以看我的另一篇博客
时间复杂度瓶颈在于查询,需要用到数论分块,为 \(O(q\sqrt n\log n)\)。
代码
1 |
|